﻿using System;
using System.Configuration;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace Com.Angelia.Afiliador.Interfaz.Front.Presentadores.Utilidades
{
    /// <summary>
    /// Clase que se encarga de crear el header y footer de los pdf
    /// </summary>
    public class PaginaPdf : PdfPageEventHelper
    {
        #region Atributos

        private string _notaFooter;
        private string _nombreBanco;
        private string _titulo;
        private string _intervalo;
        #endregion

        #region Constructor

        /// <summary>
        /// Constructor que asigna el texto que aparecera en footer
        /// </summary>
        public PaginaPdf(string notaFooter, string nombreBanco, string titulo)
        {
            _notaFooter = notaFooter;
            _nombreBanco = nombreBanco;
            _titulo = titulo;
        }

        /// <summary>
        /// Constructor que asigna el texto que aparecera en footer
        /// </summary>
        public PaginaPdf(string notaFooter, string nombreBanco, string titulo, string intervalo)
        {
            _notaFooter = notaFooter;
            _nombreBanco = nombreBanco;
            _titulo = titulo;
            _intervalo = intervalo;
        }
        #endregion

        /// <summary>
        /// Método que permite darle formato de un datetime
        /// </summary>
        /// <param name="fecha">Fecha a darle formato.</param>
        /// <returns>String con el formato de la fecha.</returns>
        public string FormatoFecha(DateTime fecha)
        {
            return fecha.ToString("dd-MM-yyyy");
        }

        /// <summary>
        /// Metodo que sobre escribe el evento OnStartPage para agregar el header
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="document"></param>
        public override void OnStartPage(PdfWriter writer, Document document)
        {
            document.SetMargins(36,36,36,100);
            PdfPTable headerTbl = new PdfPTable(2);
            headerTbl.WidthPercentage = 100;

            #region Agregar logo

            Image logo = Image.GetInstance(ConfigurationManager.AppSettings["RutaImagenes"] + @"logoReporte.png");
            logo.Alignment = Image.LEFT_ALIGN;
            // Ajusto el tamaño de la imagen
            logo.ScalePercent(50f);
            PdfPCell cell = new PdfPCell(logo);
            cell.HorizontalAlignment = Element.ALIGN_JUSTIFIED;
            cell.Border = Rectangle.NO_BORDER;
            headerTbl.AddCell(cell);
            cell = new PdfPCell();
            cell.Border = Rectangle.NO_BORDER;
            headerTbl.AddCell(cell);

            #endregion

            headerTbl.AddCell(cell);
            headerTbl.AddCell(cell);
            #region Agregar el nombre del banco

            Chunk nombreBanco = new Chunk(_nombreBanco, FontFactory.GetFont("Verdana", 10));
            Paragraph pNombreBanco = new Paragraph(nombreBanco);

            //agregamos la fecha en la misma linea
            Chunk fechaActual = new Chunk("Fecha " + FormatoFecha(DateTime.Now),
                                          FontFactory.GetFont("Verdana", 10));
            cell = new PdfPCell(pNombreBanco);
            cell.Border = Rectangle.NO_BORDER;
            cell.HorizontalAlignment = Element.ALIGN_LEFT;
            cell.VerticalAlignment = Element.ALIGN_MIDDLE;
            headerTbl.AddCell(cell);

            cell = new PdfPCell(new Paragraph(fechaActual));
            cell.Border = Rectangle.NO_BORDER;
            cell.HorizontalAlignment = Element.ALIGN_RIGHT;
            cell.VerticalAlignment = Element.ALIGN_MIDDLE;
            headerTbl.AddCell(cell);
            #endregion

            #region Agregar el rif de la empresa.

            Chunk rif = new Chunk("RIF: " + ConfigurationManager.AppSettings["Rif"]+ "\n\n\n\n",
                                  FontFactory.GetFont("Verdana", 10));
            Paragraph p = new Paragraph();
            p.Alignment = Element.ALIGN_LEFT;
            p.Add(rif);
            cell = new PdfPCell(p);
            cell.Border = Rectangle.NO_BORDER;
            headerTbl.AddCell(cell);
            cell = new PdfPCell();
            cell.Border = Rectangle.NO_BORDER;
            headerTbl.AddCell(cell);

            #endregion

            #region Titulo Reporte

            Chunk titulo;
            if(string.IsNullOrEmpty(_intervalo))
                titulo = new Chunk("\n\n\n" + _titulo + "\n\n\n",
                                         FontFactory.GetFont("Verdana", 11, Font.BOLD));
            else
            {
                titulo = new Chunk("\n\n\n" + _titulo + "\n",
                                         FontFactory.GetFont("Verdana", 11, Font.BOLD));
            }
            Paragraph ptitulo = new Paragraph();
            ptitulo.Alignment = Element.ALIGN_CENTER;
            ptitulo.Add(titulo);
            cell = new PdfPCell(ptitulo);
            cell.HorizontalAlignment = Element.ALIGN_CENTER;
            cell.Border = Rectangle.NO_BORDER;
            cell.Colspan = 2;
            headerTbl.AddCell(cell);

            if (!string.IsNullOrEmpty(_intervalo))
            {
                Chunk intervalo = new Chunk(_intervalo + "\n\n",
                                            FontFactory.GetFont("Arial", 10, Font.BOLD, BaseColor.GRAY));
                Paragraph pintervalo = new Paragraph();
                pintervalo.Alignment = Element.ALIGN_CENTER;
                pintervalo.Add(intervalo);
                cell = new PdfPCell(pintervalo);
                cell.HorizontalAlignment = Element.ALIGN_CENTER;
                cell.Border = Rectangle.NO_BORDER;
                cell.Colspan = 2;
                headerTbl.AddCell(cell);
            }

            #endregion

            
            document.Add(headerTbl);
        }

        ////override the OnPageEnd event handler to add our footer
        /// <summary>
        /// Metodo que sobrescribe el evento OnPageEnd para agregar el footer
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="document"></param>
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            PdfPTable footerTbl = new PdfPTable(1);
            footerTbl.TotalWidth = document.PageSize.Width - 50;
            footerTbl.HorizontalAlignment = Element.ALIGN_CENTER;
            Console.Write(document.PageSize.Height);
            //Create a paragraph that contains the footer text
            Paragraph para = new Paragraph(new Chunk( "\n\n" + _notaFooter, FontFactory.GetFont("Verdana", 10)));

            PdfPCell cell = new PdfPCell(para);
            cell.Border = 0;
            cell.HorizontalAlignment = Element.ALIGN_CENTER;
            footerTbl.AddCell(cell);
            footerTbl.WriteSelectedRows(0, -1, document.Left, (document.BottomMargin), writer.DirectContent);
        }
    }
}
